#ifndef __CONCRETE_H__
#define __CONCRETE_H__

class DrawingLayer;
class ShapeVisual;

class Shape
	: public AbstractModel
{
public:
	virtual int getModelType() override;
};

class DrawingLayerVisualFactory
	: public AbstractVisualFactory
{
public:
	virtual AbstractVisual* createNormalVisual(AbstractModel* model, AbstractContext* context) override;
	virtual AbstractLayerVisual* createLayerVisual(AbstractLayer* model, AbstractContext* context) override;
};

class ShapeVisual
	: public AbstractVisual
{
public:
};

class DrawingLayer
	: public AbstractLayer
{
public:
	virtual int getModelType() override;
	virtual int getLayerType() override;
	Shape* createShape();
};


class DrawingLayerVisual
	: public AbstractLayerVisual
{
public:
	virtual AbstractVisualFactory* getVisualFactory() override;
};

//////////////////////////////////////////////////////////////////////////

class Document
	: public AbstractLayer
{
public:
	Document();
	DrawingLayer* createDrawing();

public:
	virtual int getModelType() override;
	virtual int getLayerType() override;
	virtual AbstractVisual* createVisual(AbstractContext*) override;
private:
	AbstractContext* m_context;
};

class DocumentLayerVisualFactory
	: public AbstractVisualFactory
{
public:
	virtual AbstractVisual* createNormalVisual(AbstractModel* model, AbstractContext* context);
	virtual AbstractLayerVisual* createLayerVisual(AbstractLayer* model, AbstractContext* context) override;
};

class DocumentLayerVisual
	: public AbstractLayerVisual
{
public:
	virtual AbstractVisualFactory* getVisualFactory() override;
};

#endif /* __CONCRETE_H__ */
